package com.lcredu.lcrspringboot;

import com.lcredu.lcrspringboot.config.LcrConfig;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

/**
 * @author 黎长容
 * @date 2025-08-10 19:53
 * 作为 Spring 的容器
 * <p>
 * 1. 创建我们的 spring 容器
 * 2. 并加载/关联 spring 容器的配置- 按注解方式
 * 3. 完成 spring 容器配置的 bean 的创建, 依赖注入等
 * 4. 创建分发器 DispatcherServlet ,并让其持有 spring 容器
 * 5. 当 DispatcherServlet 持有容器，就可以进行分发映射, 请小伙伴回忆我们实现
 * springmvc 底层机制程序
 * 6.这个类的 onStartup 是 Tomcat 来调用，并把 ServletContext 对象也传入
 */
public class LcrWebApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        System.out.println("startup ...");
        // 1. 创建 Spring 容器 (Web 环境下的应用上下文)
        AnnotationConfigWebApplicationContext ac = new AnnotationConfigWebApplicationContext();

        // 2. 注册配置类，关联 Spring 容器与配置
        ac.register(LcrConfig.class);
        // 3. 刷新容器，完成 Bean 的创建和依赖注入等操作
        ac.refresh();

        // 4. 创建 Spring MVC 的核心组件 DispatcherServlet，并传入 Spring 容器
        // DispatcherServlet 持有 Spring 容器后可以进行请求的分发处理
        DispatcherServlet dispatcherServlet = new DispatcherServlet(ac);

        // 5. 将 DispatcherServlet 注册到 ServletContext 中
        ServletRegistration.Dynamic registration = servletContext.addServlet("app", dispatcherServlet);
        
        // 6. 设置 DispatcherServlet 在容器启动时加载
        registration.setLoadOnStartup(1);
        // 7. 设置 DispatcherServlet 处理所有请求路径
        registration.addMapping("/*");
    }
}
